]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
layout: Compute strut side more precisely for non primary monitors
authorSylvain Pasche <sylvain.pasche@gmail.com>
Sun, 8 Feb 2015 22:03:07 +0000 (23:03 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 20 Feb 2015 12:59:39 +0000 (13:59 +0100)
Don't assume struts are on the primary monitor while computing
the strut side. Instead, find the first monitor that overlaps the
strut and compute the strut side using it.

https://bugzilla.gnome.org/show_bug.cgi?id=744183

js/ui/layout.js

index 204ab947432df4bdaf21e637730246f14b195578..407d73e91e0ea1b7158a264d08d1f89bf362479a 100644 (file)
@@ -973,46 +973,39 @@ const LayoutManager = new Lang.Class({
                 let y1 = Math.max(y, 0);
                 let y2 = Math.min(y + h, global.screen_height);
 
-                // NetWM struts are not really powerful enought to handle
-                // a multi-monitor scenario, they only describe what happens
-                // around the outer sides of the full display region. However
-                // it can describe a partial region along each side, so
-                // we can support having the struts only affect the
-                // primary monitor. This should be enough as we only have
-                // chrome affecting the struts on the primary monitor so
-                // far.
-                //
-                // Metacity wants to know what side of the screen the
-                // strut is considered to be attached to. If the actor is
+                // Metacity wants to know what side of the monitor the
+                // strut is considered to be attached to. First, we find
+                // the monitor that contains the strut. If the actor is
                 // only touching one edge, or is touching the entire
-                // border of the primary monitor, then it's obvious which
-                // side to call it. If it's in a corner, we pick a side
-                // arbitrarily. If it doesn't touch any edges, or it spans
-                // the width/height across the middle of the screen, then
-                // we don't create a strut for it at all.
+                // border of that monitor, then it's obvious which side
+                // to call it. If it's in a corner, we pick a side
+                // arbitrarily. If it doesn't touch any edges, or it
+                // spans the width/height across the middle of the
+                // screen, then we don't create a strut for it at all.
+
+                let monitor = this.findMonitorForActor(actorData.actor);
                 let side;
-                let primary = this.primaryMonitor;
-                if (x1 <= primary.x && x2 >= primary.x + primary.width) {
-                    if (y1 <= primary.y)
+                if (x1 <= monitor.x && x2 >= monitor.x + monitor.width) {
+                    if (y1 <= monitor.y)
                         side = Meta.Side.TOP;
-                    else if (y2 >= primary.y + primary.height)
+                    else if (y2 >= monitor.y + monitor.height)
                         side = Meta.Side.BOTTOM;
                     else
                         continue;
-                } else if (y1 <= primary.y && y2 >= primary.y + primary.height) {
-                    if (x1 <= 0)
+                } else if (y1 <= monitor.y && y2 >= monitor.y + monitor.height) {
+                    if (x1 <= monitor.x)
                         side = Meta.Side.LEFT;
-                    else if (x2 >= primary.x + primary.width)
+                    else if (x2 >= monitor.x + monitor.width)
                         side = Meta.Side.RIGHT;
                     else
                         continue;
-                } else if (x1 <= 0)
+                } else if (x1 <= monitor.x)
                     side = Meta.Side.LEFT;
-                else if (y1 <= 0)
+                else if (y1 <= monitor.y)
                     side = Meta.Side.TOP;
-                else if (x2 >= global.screen_width)
+                else if (x2 >= monitor.x + monitor.width)
                     side = Meta.Side.RIGHT;
-                else if (y2 >= global.screen_height)
+                else if (y2 >= monitor.y + monitor.height)
                     side = Meta.Side.BOTTOM;
                 else
                     continue;